using namespace std;

#include "AnimadorElementos.h"

AnimadorElementos::AnimadorElementos(bool atributo) : Thread(atributo){
};

AnimadorElementos::~AnimadorElementos() {
	free(this);
};

//Manejador de señales de interrupcion.
void AnimadorElementos::signalHandler(int signal){
	if(signal == SIGCLD){
		/* Informo la finalizacion por sysout */
		cout<< "[INFO] - Se cierra el hilo animador de objetos animados. "<< endl;
		/* Cierro el thread. */
		pthread_exit(NULL);
	}
}

/* Metodo ejecutor del thread */
void AnimadorElementos::run (){
	/* Me attacho a la señal que envia el server para finalizar. */
	signal(SIGFPE, AnimadorElementos::signalHandler);
	signal(SIGILL, AnimadorElementos::signalHandler);
	signal(SIGURG, AnimadorElementos::signalHandler);
	signal(SIGABRT, AnimadorElementos::signalHandler);
	signal(SIGCLD, AnimadorElementos::signalHandler);
	signal(SIGQUIT, AnimadorElementos::signalHandler);
	signal(SIGIO,  AnimadorElementos::signalHandler);

	/* Mientras la partida este activa */
	while (Partida::getInstance()->isActivo()) {
		/* Si no esta parada la partida animo los objetos, caso contrario duermo un poco mas */
		if(!(Partida::getInstance()->isStoped()))
			/* Le indico al juego que mueva los objetos animados. */
			Partida::getInstance()->animar();

		/* Doy un lapso del tiempo del juego, antes de seguir. */
		sleep(1);
	}

	//Cierro el thread.
	pthread_exit(NULL);
}
	
